Docker 命令(快速理解)

作者: 李多多 日期: 2019-08-15
Docker
Docker 命令(快速理解)

最近在看docker,整理了部分命令出来,我都是用大白话写出来的,快速理解!言简意赅,后续继续补充。。。大家将就着看。

#service docker start  开启docker
#service docker restart 重启docker

使用Docker 中国加速器:

vi  /etc/docker/daemon.json

#添加后:
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"live-restore": true
}
[root@localhost lemon]# docker ps -a   (查看所有容器)
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e50ef9a67cab rabbitmq:3-management "docker-entrypoint.s…" 14 minutes ago Up 14 minutes 0.0.0.0:32773->4369/tcp, 0.0.0.0:32772->5671/tcp, 0.0.0.0:32771->5672/tcp, 0.0.0.0:32770->15671/tcp, 0.0.0.0:32769->15672/tcp, 0.0.0.0:32768->25672/tcp some-rabbit
e15a786d3e8e hello-world "/hello" 34 minutes ago Exited (0) 34 minutes ago agitated_tharp
9a989a595613 mysql:5.7 "docker-entrypoint.s…" 3 months ago Exited (255) 3 months ago 0.0.0.0:3306->3306/tcp, 33060/tcp mysql

名词解释:

  1. CONTAIINER ID
    指的是容器的id,是唯一的标识符,在不会混淆的情况下可以采用id的前几位进行标识一个容器。
  2. INAGE
    表示创建容器时使用的镜像
  3. COMMAND
    表示容器最后运行的命令。
  4. CREATED
    创建容器的时间
  5. STATUS
    容器的状态,这里可能显示的一个容器启动时间,也能显示容器的关闭时间。具体看看容器当前的状态
  6. PORTS
    容器对外开放的端口
  7. NAMES
    容器名字,如果不设置,就会有一个默认名。

启动docker后,

# docker ps     查看当前正在运行的容器
# docker ps -a 查看所有容器
# docker ps -l 查看最近创建的容器
# docker ps -n=xxx docker ps -n=2 查看最新创建的2个容器

【创建容器】

#docker create nginx  (创建一个nginx容器,未启动,name是随机的)

可以使用 docker ps -a 查看,如果status状态没有时间,则是未启动。

也可在创建时指定name, # docker create –name=nginx nginx (未启动,区别:run启动,create未启动)
#docker run –name nginx1 -d -p 8080:80 nginx (name:容器名字,-d表示容器后台运行,-p将80端口映射到8080端口)

测试:浏览器输入:127.0.0.1:8080

【创建交互型容器】
例:创建ubuntu容器,命令执行完后,会打开一个输入终端:

# docker run --name ubuntu -it ubuntu /bin/bash (-it:i表示开发容器的标准输入,t为容器创建一个命令行终端)

【容器启动】
docker run (创建的容器就已经启动,用此命令时,就会自动去Docker Hub上下载相关镜像)

#docker run --name nginx1 -d -p 8080:80 nginx (name:容器名字,-d表示容器后台运行,-p将80端口映射到8080端口)

测试:浏览器输入:127.0.0.1:8080
docker create创建的未启动,需要docker start 容器id/name 启动:
例:

#docker start nginx1  或 #docker start e50ef9a67cab 

【容器重启】

#docker restart 容器ID或容器名 (不管容器是否启动,直接重启容器)
#docker restart 参数 (例如:#docker restart -t=60 容器ID或容器名)

-t:关闭容器的限时,如果超时未能关闭则用kill强制关闭,默认值10s,这个时间用于容器的自己保存状态

【容器自启动】
docker服务重启、机器重启、容器本身异常退出等原因,导致容器停止对外工作,需要自动重启,docker有自己的守护方式 restart policy.

restart policy

在docker run时通过–restart 设置守护机制,有四种模式 :

no: 不自动重新启动容器。(默认)

on-failure : 由于一个错误退出,它表现为退出状态不等于0,自动启动容器

unless-stopped : 除非被显式停止 stop、kill 否则docker服务停止或自动重启,自动启动容器

always: 如果容器停止,总是重新启动容器。(这是官方解释,我测试了如果手动kill容器 无法自动重启,应该也属于正常 如果手动都不能让他停止 也许我们会更烦恼怎么停止它。)
对于上面的模式 我们生产常用的只有always.

例:**#docker run -d -p 80:12345 –restart always –name web weba:v0.1**
(测试自启动是否成功:
1、docker ps 查看了当前运行的容器
2、service docker restart 重启docker 服务
3、再次docker ps 查看当前运行的容器,此时发现已经自动启动容器
4、最后用网页查看一下 web是否启动 )

【进入正在运行的docker容器】
1、**#docker attach**

docker attach 容器名称或容器ID

此命令如果进入一些web服务会一致卡着无反应,猜测是监听阻塞了进入,而且已此方式进入容器如果执行exit或关闭会话 会停止掉容器。因此我们在生产环境中不用此命令。

2、**#docker exec**

docker exec -it 59ec /bin/bash (后补:如果提示“/bin/bash 未找到”之类的 可以改成:docker exec -it 59ec sh 此种问题我在centos中遇到过,ubuntu未测试)
执行会看到命令行的开头出现了变化,因为已经进入到了容器里面。

接下来我们在容器里面访问内部端口12345的站点
curl 127.0.0.1:12345
我们看到出现 html代码说明访问成功

【容器停止】

#docker stop 容器ID或容器名 (停止容器)
#docker kill 容器ID或容器名 (直接关闭容器)

主要区别:stop给与一定的关闭时间交由容器自己保存状态,kill直接关闭(杀死)容器

【容器删除】docker rm …
(单个删除):#docker rm ubuntu (停止运行后删除)
#docker rm -f ubuntu (强制删除)
(批量删除) :#docker rm $(docker ps -a -q) docker ps -a -q会列出所有容器的id,供rm命令删除
#docker container prune (支持删除已退出的孤立的容器)

【查看容器信息】

#docker inspect ubuntu  (查看ubuntu详细信息,id,容器名,环境变量,网络配置等)

查看容器运行状态:

#docker inspect -f='{{.Status.Running}}' ubuntu

查看容器ip地址:

#docker inspect -f='{{.NetworkSettings.IPAdress}}' ubuntu

【容器进程】

#docker top ubuntu (确保容器已启动)

【容器日志】

#docker logs ubuntu (历史日志)
#docker logs -f ubuntu (实时日志)

【容器导出】(docker的可移植性,导出到当前目录文件夹下)

#docker export $container_id > 容器快照名  (e:#docker export 5fbe4b029608 > ubuntu.tar)

【容器导入】

# docker images (列出本地镜像。)

REPOSITORY TAG IMAGE ID CREATED SIZE
rabbitmq 3-management 2fb79bc1163c 30 hours ago 177MB
mysql 5.7 7faa3c53e6d6 4 months ago 373MB
centos latest 9f38484d220f 6 months ago 202MB
hello-world latest fce289e99eb9 8 months ago 1.84kB

然后:
#cat ubuntu.tar | docker import - mycentos:v888 (mycentos:上面的REPOSITORY,v888:上面的TAG)
导入成功后,docker run 命令启动

【查看镜像】

#docker images  (查看本地所有镜像)

REPOSITORY TAG IMAGE ID CREATED SIZE
rabbitmq 3-management 2fb79bc1163c 30 hours ago 177MB
mysql 5.7 7faa3c53e6d6 4 months ago 373MB
centos latest 9f38484d220f 6 months ago 202MB
hello-world latest fce289e99eb9 8 months ago 1.84kB

名词解释:1.REPOSITORY:仓库名,一般用来存放同一类型的镜像。
[namespace\ubuntu] 这种仓库名由命名空间和实际的仓库名组成,类似Github
[ubuntu]官方的仓库名
[hub.c.163.com/library/nginx] 用于非Docker Hub上的镜像命名,例如第三方服务商提供的镜像或者开发者自己搭建的镜像中心。
2.TAG:区分同一仓库中的不同镜像,默认为latest
3.IMAGE ID:唯一标识符
4.CREATED:创建时间
5.SIZE:镜像大小

【下载镜像】

#docker pull hub.c.163.com/library/nginx:latest   (如果docker run下载慢,先pull下载下来,然后再运行)
#docker images 查看
#docker run -itd --name 163nginx -p 80:80 hub.c.163.com/library/nginx:latest (运行)

【删除镜像】docker rmi …(参数为镜像的id或者镜像名,可有多个,中间用逗号隔开)

#docker images 查看
#docker rmi 2fb79bc1163c hello-world:latest (删除id为2fb..和hello-world的镜像)

注:有时候无法删除一个镜像大部分原因是因为该镜像被一个容器所依赖,要先删除容器,再删镜像。

【创建本地镜像】

#docker commit -m "describe" -author="zhangsan" ce1fe32739402 zhangsan/nginx:v1

1.参数-m是创建该镜像的一个简单描述
2.–author 表示该镜像的作者
3.ce1fe32739402 表示创建镜像所依据的容器id
4.zhangsan/nginx 为仓库名,zhangsan是命名空间,mginx是镜像名
5.v1表示仓库的tag
6.创建完成后,通过docker images就可以看到刚刚创建的镜像
7.通过刚刚创建的镜像运行一个容器,访问该容器,发现nginx内容已经改变。

【Dockerfile】详细点击下文:
Dockerfile 使用介绍

Dockerfile 命令详解

【Docker Hub】
类似于GitHub,镜像托管服务,地址为:https://hub.docker.com/ (如果嫌太慢,用网易的:https://c.163yun.com/hub#/m/home)
打开Docker Hub,注册一个账号。
在客户端命令行登录:

# docker login

看到Login Succeeded表示成功。

登录成功后,就可以使用push命令上传我们自制的镜像了。命名要规范,即namespace/name格式,namespace必须是用户名

#docker build -t iweirdo/nginx:v1

【暴露网络端口】
Docker中设计暴露网络端口的参数有两个,分别是-p和-P (大小写)
1、使用-P:

Docker会在宿主机上随机为应用分配一个未被使用的端口,并将其映射到容器开放的端口,以Nginx为例,如下:

[root@localhost lemon]# docker run -itd --name nginx -P 5a3221f0137b
40958d13ea6a274c493bd1e2135f8416d8eb138cf510320c4f68019e1d1e41f8
[root@localhost lemon]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
40958d13ea6a 5a3221f0137b "nginx -g 'daemon of…" 16 seconds ago Up 6 seconds 0.0.0.0:32768->80/tcp nginx

docker为应用分配了一个随机端口32768,使用该端口可访问容器中的nginx(http://192.168.1.132:32768)

2、使用-p:
-p参数有几种不同的用法:

hostPort:containerPort (这种方法是将宿主机端口和容器端口绑定起来,如下:)

[root@localhost lemon]# docker run -itd --name nginx -p 80:80 5a3221f0137b  (表示将宿主机的80端口映射到容器的80上,第一个80是宿主机的80,第二个80是容器的80)

ip:hostPort:containerPort (这种方法是将指定的ip的端口和容器的端口进行映射,如下:)

[root@localhost lemon]# docker run -itd --name nginx -p 192.168.1.132:80:80 5a3221f0137b (表示将192.168.1.132地址的80端口映射到容器的80端口上)

ip::containerPort (这种是将指定的ip地址的随机端口映射到容器的开放端口上,如下:)

[root@localhost lemon]# docker run -itd --name nginx -p 192.168.1.132::80 5a3221f0137b

未完待续。。